/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package model.handler;

import java.sql.SQLException;
import java.util.Date;
import java.util.LinkedList;
import model.dao.LoteMudaDAO;
import model.dto.LoteMudaDTO;
import model.exception.MissingIdException;
import model.exception.NoChangesOnUpdateException;
import model.exception.NotNullFieldsException;

/**
 *
 * @author Gabriel
 */
public class LoteMudaHandler {

    LoteMudaDAO loteMudaDAO;

    public LoteMudaHandler() throws SQLException, ClassNotFoundException {
        loteMudaDAO = new LoteMudaDAO();
    }

    private void verificaCamposNotNullInsercao(LoteMudaDTO loteMudaDTO) throws NotNullFieldsException {
        if (loteMudaDTO.getDataPlantio() == null) {
            throw new NotNullFieldsException("A Data de Plantio é informação obrigatória de um Lote de Mudas");
        }

        if (loteMudaDTO.getIdFaseMudas() == null) {
            throw new NotNullFieldsException("A Fase da Muda é informação obrigatória de um Lote de Mudas");
        }

        if (loteMudaDTO.getQtdMudas() == null) {
            throw new NotNullFieldsException("A Quantidade de Mudas é informação obrigatória de um Lote de Mudas");
        }
    }

    private void verificaCamposNotNullAtualizacao(LoteMudaDTO loteMudaDTO,
                                                  boolean atualizaDataPlantio) throws NotNullFieldsException {
        if ((loteMudaDTO.getDataPlantio() == null) && atualizaDataPlantio) {
            throw new NotNullFieldsException("A Data de Plantio é informação obrigatória de um Lote de Mudas");
        }
    }

    public LinkedList<LoteMudaDTO> pesquisaLoteMuda(Integer id,
                                                    String nomeEspecie,
                                                    Date dataPlantio,
                                                    String faseMuda,
                                                    String localArmazenamento,
                                                    Integer qtdMudas) throws SQLException {
        return loteMudaDAO.pesquisaLoteMuda(id, nomeEspecie, dataPlantio, faseMuda, localArmazenamento, qtdMudas);
    }

    public void cadastraLoteMuda(LoteMudaDTO loteMudaDTO) throws SQLException, NotNullFieldsException {
        verificaCamposNotNullInsercao(loteMudaDTO);
        loteMudaDAO.insereLoteMuda(loteMudaDTO);
    }

    public void atualizaLoteMuda(LoteMudaDTO loteMudaDTO,
                                 boolean atualizaDataPlantio) throws MissingIdException, NotNullFieldsException, NoChangesOnUpdateException, SQLException {

        // Verifica se o identificador foi passado
        if (loteMudaDTO.getId() == null) {
            throw new MissingIdException();
        }

        verificaCamposNotNullAtualizacao(loteMudaDTO, atualizaDataPlantio);

        /* Verifica se existe atualização */
        if (!(atualizaDataPlantio)) {
            throw new NoChangesOnUpdateException();
        }

        // Invoca chamada à base
        loteMudaDAO.atualizaLoteMuda(loteMudaDTO, atualizaDataPlantio);

    }

}
